package cn.itcast.service.impl;

import cn.ali.OssUtil;
import cn.itcast.mapper.EmpExprMapper;
import cn.itcast.mapper.EmpMapper;
import cn.itcast.mapper.LogMapper;
import cn.itcast.pojo.*;
import cn.itcast.service.EmpService;
import cn.itcast.utils.TokenUtil;
import com.aliyuncs.exceptions.ClientException;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

@Service
@Slf4j
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private EmpExprMapper empExprMapper;

    @Autowired
    private OssUtil ossUtil;

    @Autowired
    private TokenUtil tokenUtil;

    @Autowired
    private LogMapper logMapper;
    //分页查询
    @Override
    public PageInfo findByCondition(QuaryParma quaryParma) {
        //开启分页
        PageHelper.startPage(quaryParma.getPage(), quaryParma.getPageSize());
        //调用dao层方法生成员工集合
        List<Emp> list = empMapper.findByCondition(quaryParma);
        //强转
        Page<Emp> page = (Page<Emp>) list;
        //封装成pageinfo
        PageInfo<Emp> pageInfo = new PageInfo<>((int) page.getTotal(), page.getResult());
        return pageInfo;
    }

    //添加员工
    @Override
    public boolean add(Emp emp) {
        // 补全员工基本数据
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        emp.setPassword("1234");

        // 添加员工信息
        int row = empMapper.add(emp);
        // 如果员工添加成功且包含工作经历信息，则添加工作经历
        if (emp.getExprList() != null && emp.getExprList().size() != 0) {
            //遍历员工的工作经历给每一个工作经历都加上员工的id
            emp.getExprList().forEach(empExpr -> empExpr.setEmpId(emp.getId()));
        }
        return row > 0;
    }

    //删除员工

   //   @Transactional
    @Override
    public boolean deleteById(int[] ids) {
        //校验这个ids不能为null长度>0再去
        if (ids != null && ids.length > 0) {
            // 批量查询员工
            List<Emp> list = empMapper.findByIds(ids);
            //批量删除他的头像
            list.forEach(emp -> {
                String image = emp.getImage();
                try {
                    ossUtil.delete(image);
                } catch (ClientException e) {

                }
            });
            //批量删除员工
            empMapper.delete(ids);
            //批量删除工作经历
            empExprMapper.deleteById(ids);

            return true;

        }
        return false;
    }

    //根据id查找员工
    @Override
    public Emp findById(Integer id) {
        //调用empMapper查找员工
        Emp emps = empMapper.findById(id);
        //调用empExprMapper的根据Id查找工作经历
        List<EmpExpr> empExprs = empExprMapper.findById(id);
        //给员工设置找到的工作经历
        emps.setExprList(empExprs);
        return emps;
    }

    //修改员工信息
    @Override
    public boolean update(Emp emp) throws ClientException {
       //emp.setUpdateTime(LocalDateTime.now());
        //删除头像
        //getimage,上传的头像
        String url = empMapper.findImageById(emp.getId());
        if (url != null && !url.equals(emp.getImage())) {
            ossUtil.delete(url);
        }
        Integer empid = emp.getId();
        //调用方法修改员工
        int row = empMapper.update(emp);
        //添加新的工作经历
        if (emp.getExprList() != null && emp.getExprList().size() > 0) {
            //删除原来的工作经历
            empExprMapper.deleteById(new int[]{empid});
            //给所有工作经历设置上员工Id
            emp.getExprList().forEach(expr -> expr.setEmpId(empid));
            //添加新的工作经历
            empExprMapper.addexpr(emp.getExprList());
        }
        return row > 0;
    }

    //查询全部员工
    @Override
    public List<Emp> findAll() {
        List<Emp> all = empMapper.findAll();

        return all;
    }

    //批量查询员工
    @Override
    public List<Emp> findByIds(int[] ids) {
        List<Emp> list = empMapper.findByIds(ids);

        return list;
    }

    //登录
    @Override
    public LoginVO login(Emp emp) {
        Emp login = empMapper.login(emp);
        if (login != null) {
            HashMap<String, Object> map = new HashMap<>();
            map.put("id", login.getId());
            map.put("username", login.getUsername());
            map.put("name", login.getName());
            // 使用当前时间生成令牌
            String token = tokenUtil.makeToken(map,new Date(System.currentTimeMillis() + 1000 * 60 * 60));

            // 创建登录信息对象，包含用户ID、用户名、姓名和认证令牌
            LoginVO loginInfo = new LoginVO(login.getId(), login.getUsername(), login.getName(), token);

            return loginInfo;
        }
        return null;
    }
}

